package com.lld.im.service.message.server;

import com.alibaba.fastjson.JSONObject;
import com.lld.im.common.constants.Constants;
import com.lld.im.common.enums.DelFlagEnum;
import com.lld.im.common.model.message.*;
import com.lld.im.service.utils.SnowflakeIdWorker;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * 保存单聊用户消息
 * 设计思路:
 *  单聊数据相对较小 采用写扩散的方式 即将数据信息写入到双方的消息队列中
 *  同时为保证消息的顺序 使用雪花算法(生成的id有时序) 进行唯一性标识
 */
@Service
public class MessageStoreServer {



//    @Autowired
//    private ImMessageBodyMapper messageBodyMapper;
//
//    @Autowired
//    private ImMessageHistoryMapper messageHistoryMapper;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Transactional
    public void storeP2PMessage(MessageContent messageContent){
        ImMessageBody imMessageBody = createImMessageBodyEntity(messageContent);
        //写扩散 将msg 分别保存在formId和toId的消息队列中
        doStoreP2PMsg(messageContent, imMessageBody);
    }

    private void doStoreP2PMsg(MessageContent messageContent, ImMessageBody imMessageBody) {
//        ImMessageHistoryEntity fromIdMsgEntity = new ImMessageHistoryEntity();
//        BeanUtils.copyProperties(imMessageBody,fromIdMsgEntity);
//        fromIdMsgEntity.setFromId(messageContent.getFromId());
//        fromIdMsgEntity.setOwnerId(messageContent.getFromId());
//        fromIdMsgEntity.setToId(messageContent.getToId());

//        ImMessageHistoryEntity toIdMsgEntity = new ImMessageHistoryEntity();
//        BeanUtils.copyProperties(imMessageBody,toIdMsgEntity);
//        toIdMsgEntity.setFromId(messageContent.getFromId());
//        toIdMsgEntity.setOwnerId(messageContent.getToId());
//        toIdMsgEntity.setToId(messageContent.getToId());
//        ArrayList<ImMessageHistoryEntity> list = new ArrayList<>();
//        list.add(fromIdMsgEntity);
//        list.add(toIdMsgEntity);
        DoStoreP2PMessageDto dto = new DoStoreP2PMessageDto();
        dto.setMessageBody(imMessageBody);
        dto.setMessageContent(messageContent);
        //TODO 使用mq将消息投递到msg-store处理
        rabbitTemplate.convertAndSend(Constants.RabbitConstants.StoreP2PMessage,""
        , JSONObject.toJSONString(dto));
        //保存发送消息记录 保存到数据库
//        messageHistoryMapper.insertBatchSomeColumn(list);
        //保存实际消息到数据库
//        messageBodyMapper.insert(imMessageBody);
    }

    private ImMessageBody createImMessageBodyEntity(MessageContent messageContent) {
        ImMessageBody messageBody = new ImMessageBody();
        messageBody.setAppId(messageContent.getAppId());
        messageBody.setMessageTime(messageContent.getMessageTime());
        messageBody.setMessageKey(SnowflakeIdWorker.nextId());
        messageBody.setCreateTime(System.currentTimeMillis());
        messageBody.setMessageBody(messageContent.getMessageContent());
        messageBody.setDelFlag(DelFlagEnum.NORMAL.getCode());
        messageBody.setExtra(messageContent.getExtra());
        messageBody.setSecurityKey("");
        messageContent.setMessageKey(messageBody.getMessageKey());
        return messageBody;
    }

    @Transactional
    public void storeGroupMessage(GroupMessageContent messageContent){
        ImMessageBody imMessageBody = createImMessageBodyEntity(messageContent);
        DoStoreGroupMessageDto dto = new DoStoreGroupMessageDto();
        dto.setMessageBody(imMessageBody);
        dto.setGroupChatMessageContent(messageContent);
        messageContent.setMessageKey(imMessageBody.getMessageKey());

        rabbitTemplate.convertAndSend(Constants.RabbitConstants.StoreGroupMessage,
                "",
                JSONObject.toJSONString(dto));
    }
}
